package com.cd.queue.controller;

import com.cd.common.controller.BaseController;
import com.cd.common.domain.AjaxResult;
import com.cd.common.exception.LqqException;
import com.cd.common.util.AuthUtils;
import com.cd.queue.api.QueueService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/queue")
//排号系统
public class queueController extends BaseController {

    @Autowired
    private QueueService queueService;

    //获取排号信息  //todo 优化 如果这里为null 说明重启过 看看数据库有没有数据 取版本最新的
    @GetMapping("/queue")
    public AjaxResult getQueueInfo(@RequestParam String organiser){
        return success(queueService.getQueueInfo(organiser));
    }

    //排号 //todo 加号则异步备份数据库
    @PutMapping("/queue")
    public AjaxResult queue(@RequestParam String organiser,
                            @RequestParam String targetName){
        //付费用户可插号？是不是吃相难看 可以参考崩铁vip队和普通队 两边混合起来按比例喊号
        //自主排号
        //admin排号 需要用户名即可
        checkUserPermission(organiser);
        return success(queueService.addNormal(organiser,targetName));
    }

    /**
     * @Description 批量排号 //todo 加号则异步备份数据库
     * @Author lqq
     * @Date 2025/4/17 13:43
     **/
    @PutMapping("/queueBatch")
    public AjaxResult queueBatch(@RequestParam String organiser,
                            @RequestParam List<String> targetNames){
        //付费用户可插号？是不是吃相难看 可以参考崩铁vip队和普通队 两边混合起来按比例喊号
        //自主排号
        //admin排号 需要用户名即可
        checkUserPermission(organiser);
        return success(queueService.batchAdd(organiser,targetNames));
    }


    //取消排号
    @DeleteMapping("/queue")
    public AjaxResult deleteQueue(@RequestParam String organiser,
                                  @RequestParam String targetName){
        //付费用户可插号？是不是吃相难看 可以参考崩铁vip队和普通队 两边混合起来按比例喊号
        //自主排号
        //admin排号 需要用户名即可
        checkUserPermission(organiser);
        return success(queueService.revokeNormal(organiser,targetName));
    }

    //过号
    @DeleteMapping("/over")
    public AjaxResult over(@RequestParam String organiser,
                           @RequestParam String mode){
        //超时过号 一分钟  自主过号 admin下号
        checkUserPermission(organiser);
        return success(queueService.poll(organiser,mode));
    }

    @PostMapping("/clear")
    public AjaxResult clear(@RequestParam String organiser){
        //超时过号 一分钟  自主过号 admin下号
        checkUserPermission(organiser);
        return success(queueService.clear(organiser));

    }

    //查询自己排号情况
//    @RequestMapping("/getMyQueueInfo")
//    public String getMyQueueInfo(){
//        return "排号信息";
//    }

    private void checkUserPermission(String organiser) {
        if (!organiser.equals(AuthUtils.currentUsername())){
            throw new LqqException("禁止操作其他人队列");
        }
    }
}
